<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
<script>
    /*
    * 备忘录模式（后悔药）：
    *   在不破坏封装的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态。这样以后就可以将该对象回复到原先保存的状态。
    *
    * 例子：
    * 打野去打野怪，打到一半不打了走人，野怪就会慢慢恢复状态
    *
    * */

    var RedBuff = function (){
        //状态的存储对象
        var state = {} //用var就是挂在window对象上，用this就是存在该对象内部
        this.initState() //执行一下初始化状态函数initState，实例化生成对象的时候才能访问到

        //使用桥接模式，让外部可以访问下面属性
        //设置最新状态
        this.setState = function (obj){ //接收一个对象，该对象内部保存了最新状态
            state = obj //最新状态赋值给状态
        }
        //让外部可以获得状态
        this.getState = function (){
            return state
        }
    }

    //初始化状态
    RedBuff.prototype.initState = function (){
        this.Hp = 100 //血量
        this.point = "50,50" //坐标
    }

    //展示当前状态
    RedBuff.prototype.stateDisplay = function (){
        console.log(`实例对象红buff当前状态是血量:${hbf.Hp},坐标:${hbf.point}`)
    }

    //保存最新状态
    RedBuff.prototype.saveState = function (){
        this.setState({
            "Hp":this.Hp,
            "point":this.point
        })
    }

    //恢复最初状态（把备忘录里面的数据恢复）
    RedBuff.prototype.recoverState = function (){
        var state = this.getState() //将getState方法执行后返回的对象给变量state保存，此时就得到了最初保存时的状态对象
        this.Hp = state.Hp
        this.point = state.point
    }

    //红buff被攻击后的状态
    RedBuff.prototype.beAttack = function (hp,point){
        this.Hp = this.Hp - hp
        this.point = point
    }

    //红buff出生
    console.log("1.此时，一个红buff刷新了")
    var hbf = new RedBuff()
    hbf.stateDisplay() //看看最初的状态

    //保存当前状态
    hbf.saveState()
    console.log("2.存档保存红buff最初的状态，血量:100,坐标:50,50")

    //打野开始，红buff被连续攻击了两次
    console.log("3.打野开始，第一次攻击10，坐标变成60,60")
    hbf.beAttack(10,"60,60")
    hbf.stateDisplay()
    console.log("4.打野继续，第二次攻击20，坐标变成80,80")
    hbf.beAttack(20,"80,80")
    hbf.stateDisplay()

    //不打了走人，红buff恢复状态
    console.log("5.打野不想打了，直接走人，红buff开始恢复到最初保存时的状态")
    hbf.recoverState()
    hbf.stateDisplay()

</script>
</body>
</html>